package com.ruoyi.vqms.service.impl;

import com.ruoyi.common.constant.VQMSConstants;
import com.ruoyi.vqms.domain.*;
import com.ruoyi.vqms.domain.dto.ToMonthLoadingVO;
import com.ruoyi.vqms.mapper.*;
import com.ruoyi.vqms.service.IVQMSLedService;
import com.ruoyi.vqms.service.IVQMSQueueReservationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 预约排队 服务层实现
 */
@Service
public class VQMSQueueReservationServiceImpl implements IVQMSQueueReservationService {
    @Autowired
    private VQMSQueueReservationMapper vqmsQueueReservationMapper;
    @Autowired
    private VQMSStorehouseLocationMapper vqmsStorehouseLocationMapper;
    @Autowired
    private VQMSQueueAreaMapper vqmsQueueAreaMapper;
    @Autowired
    private VQMSQueueMapper vqmsQueueMapper;
    @Autowired
    IVQMSLedService ledService;

    @Override
    public List<VQMSQueueReservation> selectList(VQMSQueueReservation vqmsQueueReservation) {
        return vqmsQueueReservationMapper.selectList(vqmsQueueReservation);
    }

    //微信小程序查询
    @Override
    public List<VQMSQueueReservation> wxSelectList(VQMSQueueReservation vqmsQueueReservation) {
        return vqmsQueueReservationMapper.wxSelectList(vqmsQueueReservation);
    }

    @Override
    public int add(VQMSQueueReservation vqmsQueueReservation) {
        if(vqmsQueueReservation.getStatus() == VQMSConstants.STATUS_RESERVATION_SIGN){
            vqmsQueueReservation.setSignTime(new Date());
        }
        vqmsQueueReservation.setExpedited((long) 1);    //默认不加急
        int i=vqmsQueueReservationMapper.add(vqmsQueueReservation);
        //智能排队
        VQMSQueue queue=new VQMSQueue();
        queue.setFactoryId(vqmsQueueReservation.getFactoryId());
        queue.setReservationId(vqmsQueueReservation.getId());
        // 根据库位查找绑定的排队区域
        List<VQMSQueueArea> queueAreaList=vqmsQueueAreaMapper.getByLocationName(vqmsQueueReservation.getStorehouseLocationName());
        if(queueAreaList !=null && queueAreaList.size()>0){     //库位绑定有排队队列
            // 自动排队到最少的排队队列
            Long minAreaId=0l;
            int minCount=0;
            Integer maxQueueIndex=null;
            for(VQMSQueueArea queueArea : queueAreaList){
                // 查询所在队列，正在排队/装卸货中的数量
                int countQueue=vqmsQueueMapper.countByAreaId(queueArea.getId());
                //先自动排队到第一个队列，再跟下一个队列的排队数量比较
                if(minCount == 0 || minCount < countQueue){
                    minAreaId=queueArea.getId();
                    minCount=countQueue;
                    // 查询所在队列，最大排队序号
                    maxQueueIndex=vqmsQueueMapper.getMaxQueueIndex(queueArea.getId());
                    if(maxQueueIndex == null){
                        maxQueueIndex=1;
                    }else{
                        maxQueueIndex = maxQueueIndex + 1;
                    }
                }
            }
            queue.setAreaId(minAreaId);
            queue.setQueueIndex(maxQueueIndex);
            queue.setQueueTime(new Date());
            queue.setActualQueueTime(new Date());
            // 如果是当前队列没有车辆排队，则自动叫号，状态为：装卸货中
            if(minCount == 0){
                queue.setStatus(VQMSConstants.STATUS_QUEUE_LOADING);
                queue.setLoadingTime(new Date());
            // 否则状态为排队中
            }else{
                queue.setStatus(VQMSConstants.STATUS_QUEUE_WAIT);
            }
            queue.setCreateBy(vqmsQueueReservation.getDriverName());
            queue.setExpedited((long) 1);   //默认不加急
            vqmsQueueMapper.add(queue);
        } else {            //库位未绑定排队队列（只记录不排队）
            return  2;
        }
        return i;
    }

    @Override
    public int wxAdd(VQMSQueueReservation vqmsQueueReservation){
        if(vqmsQueueReservation.getStatus() == VQMSConstants.STATUS_RESERVATION_SIGN){
            vqmsQueueReservation.setSignTime(new Date());
        }
        vqmsQueueReservation.setExpedited((long) 1);    //默认不加急
        return vqmsQueueReservationMapper.add(vqmsQueueReservation);
    }

    @Override
    public VQMSQueueReservation getById(Long id) {
        return vqmsQueueReservationMapper.getById(id);
    }

    @Override
    public int update(VQMSQueueReservation vqmsQueueReservation) {
        if(vqmsQueueReservation.getStatus() == VQMSConstants.STATUS_RESERVATION_SIGN){
            vqmsQueueReservation.setSignTime(new Date());
        }
        return vqmsQueueReservationMapper.update(vqmsQueueReservation);
    }

    @Override
    public int delete(Long[] ids) {
        for(Long id : ids){
            //找到该预约对应的排队记录
            VQMSQueue vqmsQueue=vqmsQueueMapper.getByReservationId(id);
            if(vqmsQueue !=null){
                //状态：排队中，则后面车辆序号减1
                if(vqmsQueue.getStatus() == VQMSConstants.STATUS_QUEUE_WAIT){
                    List<VQMSQueue> list=vqmsQueueMapper.getMoreThanWaitingQueue(vqmsQueue.getAreaId(),vqmsQueue.getQueueIndex());
                    if(list !=null && list.size() >0){
                        for(VQMSQueue queue : list){
                            queue.setQueueIndex(queue.getQueueIndex()-1);
                            vqmsQueueMapper.update(queue);
                        }
                    }
                //状态：装卸货中，则后面第一辆车变更状态为：装卸货中，后面其余车辆序号减1
                }else if(vqmsQueue.getStatus() == VQMSConstants.STATUS_QUEUE_LOADING){
                    List<VQMSQueue> list=vqmsQueueMapper.getMoreThanWaitingQueue(vqmsQueue.getAreaId(),vqmsQueue.getQueueIndex());
                    if(list !=null && list.size() >0){
                        for(int i=0;i<list.size();i++){
                            VQMSQueue queue=list.get(i);
                            if(i==0){
                                queue.setStatus(VQMSConstants.STATUS_QUEUE_LOADING);
                            }
                            queue.setQueueIndex(queue.getQueueIndex()-1);
                            vqmsQueueMapper.update(queue);
                        }
                    }
                }
                //删除排队
                vqmsQueueMapper.delete(new Long[]{vqmsQueue.getId()});

                //刷新LED大屏
                try {
                    ledService.flushLesScreenData(vqmsQueue.getAreaId());
                } catch (Exception e) {
                    System.out.println("司机取消预约刷新LED大屏失败");
                    e.printStackTrace();
                }
            }
            //再删除预约
            vqmsQueueReservationMapper.delete(new Long[]{id});
        }

        return 1;
    }

    @Override
    public int countByFactoryId(Long factoryId) {
        return vqmsQueueReservationMapper.countByFactoryId(factoryId);
    }

    /**
     * 统计当月各任务类型总和
     * @return
     */
    @Override
    public List<ToMonthLoadingVO> selectLoading(){
        return vqmsQueueReservationMapper.selectLoading();
    }
}
